﻿#ifndef SCROLL_MODE_THREAD_H
#define SCROLL_MODE_THREAD_H

#include "libdaq/device/base_device.h"
#include <thread>
#include <vector>
#include <atomic>
#include <mutex>
#include <memory>
#include <functional>
#include <condition_variable>
#include <algorithm>

// 使用std::thread代替QThread
// 使用std::shared_ptr代替QSharedPointer
// 使用回调函数代替信号槽

class ScrollModeADCThread
{
public:
    // 定义数据回调函数类型
    using DataCallback = std::function<void(const std::vector<std::vector<float>> &data)>;
    
    ScrollModeADCThread(std::shared_ptr<libdaq::device::LockzhinerBaseDevice> base_device)
        : base_device_{base_device}, thread_is_running_{false} {}
    
    // 设置数据回调
    void setDataCallback(const DataCallback& callback) {
        data_callback_ = callback;
    }

    // 启动线程，移除QThread::Priority
    void start();
    
    // 停止线程
    void quit();

    bool thread_is_running() { return thread_is_running_;}
    
private:
    // 线程主函数
    void run();
    
    // 读取ADC数据，返回读取的数据点数
    int ReadADCData();

    std::vector<std::vector<float>> data_;  // 存储读取的数据
    std::atomic<bool> thread_is_running_; // 线程是否运行
    std::weak_ptr<libdaq::device::LockzhinerBaseDevice> base_device_; // 设备实例
    uint32_t data_length_threshold_ = 0; // 数据长度阈值，每次达到这个数据长度就往外发送数据
    uint32_t current_data_length_ = 0;  // 当前数据长度
    uint32_t batch_read_size_ = 0; // 批量读取的数据块大小
    
    // 新增成员
    std::thread thread_; // 线程对象
    std::mutex mutex_; // 互斥锁
    std::condition_variable cv_; // 条件变量
    DataCallback data_callback_; // 数据回调函数
};

#endif // SCROLL_MODE_THREAD_H
